import Stack from './Stack'

/**
 * 进制转换，可转换为2~36的任意进制
 *
 * 以十进制转二进制为例
 * 具体是算法是：把十进制数除以2并对商向下取整，直到结果为0为止，取每次的余数集合就为二进制数
 * 荔枝:10的二进制数      余数
 *    10 / 2 = 5        rem = 0
 *      5 / 2 = 2       rem = 1
 *        2 / 2 = 1     rem = 0
 *          1 / 2 = 0   rem = 1
 *  所以得出结果为:      1010
 * 其他进制就是除以不同的数字而已
 *
 * @param decNumber
 * @param base
 * @returns {string}
 */
function decimalToBinary(decNumber, base = 2) {
  const remStack = new Stack()
  const digits = '0123456789ABCEDFGHIJKLMNOPQRSTUVWXYZ'
  let number = decNumber
  // 余数
  let rem
  // 结果:二进制字符串
  let binaryString = ''

  if (!(base >= 2 && base <= 36)) {
    return ''
  }

  while (number > 0) {
    // 取余数
    rem = Math.floor(number % base)
    // 存入栈内
    remStack.push(rem)
    // 对商向下取整，用于下次计算
    number = Math.floor(number / base)
  }

  while (!remStack.isEmpty()) {
    // 从栈内取出组成字符串
    binaryString += digits[remStack.pop()]
  }

  return binaryString
}
